/*
 * InvertedListRecordListSerializer.cpp
 *
 *  Created on: Nov 30, 2012
 *      Author: m
 */

#include "InvertedListRecordListSerializer.h"

namespace physical
{

InvertedListRecordListSerializer::InvertedListRecordListSerializer() :
        m_recordSerializer( new InvertedListRecordSerializer )
{
}

InvertedListRecordListSerializer::~InvertedListRecordListSerializer()
{
}

size_t InvertedListRecordListSerializer::serialize(
        const InvertedListRecordList& element, byteStream block )
{
    byte* blockPtr = block;
    byte listSize = element.size();
    size_t usedBytes = 0;


    // Serializo el tamaño de la lista
    memcpy( blockPtr, &listSize, sizeof(byte) );

    usedBytes += sizeof(byte);
    blockPtr += sizeof(byte);


    // Serializo cada uno de los elementos
    for ( auto it = element.begin(); it != element.end(); it++ )
    {
        size_t recordSize = m_recordSerializer->serialize( *it, blockPtr );

        usedBytes += recordSize;
        blockPtr += recordSize;
    }

    return usedBytes;
}

size_t InvertedListRecordListSerializer::deserialize(
        const byteStream block, InvertedListRecordList& element )
{
    byte* blockPtr = ( byte* ) ( block );
    byte listSize;
    size_t usedBytes = 0;

    // Primero elimino el contenido previo de la lista
    element.clear();


    // Deserializo el tamaño de la lista
    memcpy( &listSize, blockPtr, sizeof(byte) );

    usedBytes += sizeof(byte);
    blockPtr += sizeof(byte);


    // Deserializo cada uno de los elementos y los agrego a la lista
    for ( byte it = 0; it < listSize; it++ )
    {
        InvertedListRecord record;

        size_t recordSize = m_recordSerializer->deserialize( blockPtr, record );

        element.push_back( record );

        usedBytes += recordSize;
        blockPtr += recordSize;
    }

    return usedBytes;
}

size_t InvertedListRecordListSerializer::getSize(
        const InvertedListRecordList& element )
{
    size_t usedBytes = 0;


    // Tamaño de la lista ( 1 byte )
    usedBytes += sizeof(byte);


    // Tamaño cada uno de los elementos
    for ( auto it = element.begin(); it != element.end(); it++ )
    {
        size_t recordSize = m_recordSerializer->getSize( *it );
        usedBytes += recordSize;
    }

    return usedBytes;
}

} /* namespace physical */
